// index.js
// 获取应用实例
const app = getApp()

Page({
  data: {
    screenData: "0",        // 用于记录输入和计算的结果 屏幕上所有数字其实是一个字符串
    lastIsOptSymbol: false, // 代表上一次用户输入的字符是不是一个操作符
    arr: [],                // 记录输入队列
    logs: []                // 计算素材与结果的历史记录
  },
  // 设置屏显文本，如果没有文本或文本无效，则默认显示0
  setScreenData(data) {
    if(data == "" || data == "——") {
      data = 0;
    }
    this.setData({
      screenData: data
    })
  },
  // 退格操作
  backOperation() {
    if(this.data.arr.length == 0) {
      return
    }
    this.data.arr.pop();
    let data = this.data.screenData;
    data = data.substring(0, data.length - 1);
    this.setScreenData(data);
  },
  // 正负号操作
  minusOperation() {
    if(this.data.arr.length == 0) {
      return
    }

    let data = this.data.screenData
    var firstChar = data.charAt(0);

    // 反转正负号
    if(firstChar == "-") {
      data = data.substr(1);
      // 首位抽出
      this.data.arr.shift();
    } else {
      data = "-" + data;
      // 首位推入
      this.data.arr.unshift("-");
    }
    this.setScreenData(data)
  },
  // 等于操作
  equalOperation() {
    if(this.data.arr.length == 0) {
      return
    }

    let data = this.data.screenData;
    // 判断最后一个字符，如果不是数字，则返回
    let lastChat = data.charAt(data.length - 1);

    if(isNaN(lastChat)) {
      return
    }

    let num = "";
    let lastOperator = "";
    let arr = this.data.arr;
    var optarr = [];

    for(var i in arr) {
      if(isNaN(arr[i]) == false || arr[i] == "." || arr[i] == "toggle") {
        // 如果是数字，或者“.”、“-”，则累加进num字符串
        num += arr[i];
      } else {
        // 剩下的是+-*/四则运算
        lastOperator = arr[i];
        // 先推入数字
        optarr.push(num);
        // 在推入操作符
        optarr.push(arr[i]);
        // 清空num字符串，在下次循环中使用
        num = "";
      }
    }

    if(num) {
      optarr.push(Number(num))
    }

    // optarr[0] 是一个字符串
    let result = Number(optarr[0])
    // console.log(result);

    // 操作符的位置 有规律 1 3 5 ……
    for(var i = 1; i < optarr.length; i = i + 2) {
      if(optarr[i] == "+") {
        // 加
        result += Number(optarr[i + 1])
      } else if(optarr[i] == "-") {
        // 减
        result -= Number(optarr[i + 1])
      } else if(optarr[i] == "*") {
        // 乘
        result *= Number(optarr[i + 1])
      } else if(optarr[i] == "÷") {
        // 除
        result /= Number(optarr[i + 1])
      }
    }

    // 储存历史数据
    this.data.logs.push(data + " = " + result);
    wx.setStorageSync("calclogs", this.data.logs);

    // 将本次计算结果存储进arr数组，以备下次计算
    this.data.arr.length = 0;   // 等效于this.data.arr = []， 前者不用新建对象，效率更高些
    this.data.arr.push(result);

    this.setScreenData(result + "")
  },
  // 监听数字和操作符事件
  numAndOtherOperation(symbol) {
    // console.log(symbol)
    const numOperateSymbols = { "+": "+", "-": "-", "x": "*", "÷": "/", ".": "." }
    if(numOperateSymbols[symbol]) { // 如果是运算符号+-*/.
      // 如果是上次的输入是运算符或者屏幕上的数组是空字符串，则退出，避免重复
      if(this.data.lastIsOptSymbol || this.data.screenData == 0) {  
        return;
      }
    }

    let sd = this.data.screenData;
    var data;
    if(sd == 0) {
      data = symbol;
    } else {
      data = sd + symbol;
    }
    // 每个数字或者操作符都推入一个数组，方便后期增删改查
    this.data.arr.push(symbol)
    // 把拼接的字符串显示在屏幕上
    this.setScreenData(data)

    this.data.lastIsOptSymbol = numOperateSymbols[symbol]
  },
  tapSymbolBtn(e) {
    let symbol = e.target.dataset["symbol"];

    // 与自定义属性data-symbol进行比较
    if(undefined == symbol) {
      return
    }

    switch(symbol) {
      case "back":
        // 退格
        this.backOperation()
        break
      case "clear":
        // 清屏
        this.setData({
          screenData: "",
          arr: []
        })
        break
      case "toggle":
        // 正负号+/-
        this.minusOperation()
        break
      case "=":
        // 等于=
        this.equalOperation()
        break
      default:
        this.numAndOtherOperation(symbol)
    }
  },

  onLoad() {
    
  },

  onShareAppMessage(res) {
    return {
      title: "可以分享计算结果的简约计算器",
      path: "/pages/index/index"
    }
  }
})
